home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / sun4.md / RCS / Sync_Unlock.s,v < prev   
Text File  |  1989-07-31  |  3KB  |  118 lines

  1. head     1.1;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @| @;
  7.  
  8.  
  9. 1.1
  10. date     89.02.24.17.03.13;  author mgbaker;  state Exp;
  11. branches ;
  12. next     ;
  13.  
  14.  
  15. desc
  16. @Thirteenth Kernel.  sun4 finishes vm init now.
  17. @
  18.  
  19.  
  20.  
  21. 1.1
  22. log
  23. @Initial revision
  24. @
  25. text
  26. @/*
  27.  * syncAsm.s --
  28.  *
  29.  *    Source code for the Sync_Unlock library procedure.
  30.  *
  31.  * Copyright 1988 Regents of the University of California
  32.  * Permission to use, copy, modify, and distribute this
  33.  * software and its documentation for any purpose and without
  34.  * fee is hereby granted, provided that the above copyright
  35.  * notice appear in all copies.  The University of California
  36.  * makes no representations about the suitability of this
  37.  * software for any purpose.  It is provided "as is" without
  38.  * express or implied warranty.
  39.  */
  40.  
  41.     .seg    "data"
  42.     .asciz "$Header: Sync_Unlock.s,v 1.1 88/06/19 14:34:19 ouster Exp $ SPRITE (Berkeley)"
  43.     .align    8
  44.     .seg    "text"
  45.  
  46. /*
  47.  *----------------------------------------------------------------------------
  48.  *
  49.  * Sync_Unlock --
  50.  *
  51.  *      Release a lock.  This is called at the end of a critical
  52.  *      section of code to allow other processes to execute within the
  53.  *      critical section.  If any processes are waiting to acquire this
  54.  *      lock they are made runnable.  They will try to gain the lock
  55.  *      again the next time they run.
  56.  *
  57.  * Results:
  58.  *    None.
  59.  *
  60.  * Side effects:
  61.  *    The lock is cleared.  Processes waiting on the lock are made runnable.
  62.  *
  63.  * C equivalent:
  64.  *
  65.  *    void
  66.  *    Sync_Unlock(lockPtr)
  67.  *        Sync_Lock *lockPtr;
  68.  *    {
  69.  *        lockPtr->inUse = 0;
  70.  *        if (lockPtr->waiting) {
  71.  *        Sync_SlowBroadcast((int)lockPtr, &lockPtr->waiting);
  72.  *        }
  73.  *    }
  74.  *
  75.  *----------------------------------------------------------------------------
  76.  */
  77.  
  78. .seg    "text"
  79. .globl _Sync_Unlock
  80. _Sync_Unlock:
  81.  
  82.     /* prologue */
  83.     set        (-104), %g1
  84.     save    %sp, %g1, %sp
  85.     /* end prologue */
  86.  
  87.     st        %g0, [%i0]    /* lockPtr->inUse = 0; */
  88.  
  89.     /*
  90.      * The check on the waiting bit races with the assignment
  91.      * statement that clears it in Sync_SlowBroadcast. In the
  92.      * worst case we assume someone is waiting that is really
  93.      * just waking up because we've cleared the inUse bit.
  94.      * That results in a wasted call to Sync_SlowBroadcast.
  95.      */
  96.  
  97.     ld        [%i0 + 4], %g1        /* get lockPtr->waiting */
  98.     tst        %g1            /* if (lockPtr->waiting) { */
  99.     be        BailOut            /*  Bail out if !lockPtr->waiting */
  100.  
  101.     /*
  102.      * Note the broadcast semantics for Sync_SlowBroadcast.
  103.      * All processes waiting on the lock will be made runnable,
  104.      * however, all but one will sleep again inside Sync_SlowLock.
  105.      */
  106.     nop
  107.     mov        %i0, %g1    /* get address of lockPtr->waiting */
  108.     add        %g1, 4, %g1
  109.     mov        %i0, %o0    /* first arg is lockPtr */
  110.     mov        %g1, %o1    /* next arg is &lockPtr->waiting */
  111.     call    _Sync_SlowBroadcast,2
  112.     nop
  113.  
  114. BailOut:
  115.     ret
  116.     restore
  117. @
  118.